package org.zjt.chapter1.zero.copy;

import lombok.extern.slf4j.Slf4j;
import org.junit.Test;

import java.nio.ByteBuffer;
import java.nio.charset.Charset;

/**
 * Description:
 *
 *
 * ByteBuffer 的重写：
 *
 *      0 <= mark <= position <= limit <= capacity

         limit和position的值除了通过limit()和position()函数来设置，也可以通过下面这些函数来改变：

         Buffer clear()             可以重写
            把position设为0，把limit设为capacity，一般在把数据写入Buffer前调用。

         Buffer flip()              写 -> 读
            把limit设为当前position，把position设为0，一般在从Buffer读出数据前调用。

         Buffer rewind()            重新写（再写）
            把position设为0，limit不变，一般在把数据重写入Buffer前调用。

名词解释 :

    limit ：读写的最后一个index
    capacity： 总大小（不变）
    position： 读写开始的index


    flip     写 -> 读

    rewind   写 -> 覆盖写

    clear    清除所有（重写）


 *
 * @author juntao.zhang
 * Date: 2018-06-29 下午1:24
 * @see
 */
@Slf4j
public class NioByteBufferTest {

    private static final Charset CHARSET = Charset.defaultCharset();

    @Test
    public void main() {
        byte[] bytes = "hello world".getBytes();

        ByteBuffer buffer1 = ByteBuffer.allocate(1024).put(bytes);
        buffer1.flip();
        log.info(CHARSET.decode(buffer1).toString());

        ByteBuffer directBuffer = ByteBuffer.allocateDirect(1024).put(bytes);
        directBuffer.flip();
        log.info(CHARSET.decode(directBuffer).toString());

        ByteBuffer buffer2 = ByteBuffer.wrap(bytes);
        log.info(CHARSET.decode(buffer2).toString());
    }



    @Test
    public void reReadByteBuffer() {
        byte[] bytes = "hello world".getBytes();
        ByteBuffer buffer = CHARSET.encode(new String(bytes));
        log.info(CHARSET.decode(buffer).toString());

        buffer = CHARSET.encode(new String(bytes));
        log.info(CHARSET.decode(buffer).toString());
    }

    /**
     * 重写
     */
    @Test
    public void reWriteByteBuffer() {

        byte[] bytes = "hello world".getBytes();
        ByteBuffer buffer = CHARSET.encode(new String(bytes));
        log.info(CHARSET.decode(buffer).toString());
        log.info(buffer.toString());
        buffer.rewind();
        log.info(buffer.toString());
        buffer.put("hello zhang".getBytes());
        buffer.flip();
        log.info(CHARSET.decode(buffer).toString());
    }
}
